自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(137)
  • 资源 (12)
  • 问答 (1)
  • 收藏
  • 关注

原创 Qt在任务栏图标和系统托盘图标上显示红点

关键类:QWinTaskbarButtonUI可以参考OBS录制开启。checked为true显示红点,false不显示红点。使用QWinTaskbarButton::setOverlayIcon设置覆盖图标。

2024-05-01 02:04:12 674 1

原创 基于Qt+FFmpeg的视频监控系统

假设一个业务场景:每个员工工位旁有两个网络摄像头。老板需要一个员工监控软件,在上班时软件可以拉取RTSP视频流,也可以随时录制视频。这样老板就可以知道谁在摸鱼了 ◕‿◕为防有人上纲上线,在此特别声明:上面的场景是开玩笑的。监控软件有很多使用场景:学校,公安,交通,考试,零售等等。

2023-05-17 14:30:16 992 2

原创 RTP分析

RTP(A Transport Protocol for Real-Time Applications–实时传输协议,rfc3550)

2023-04-04 14:39:01 1423

原创 RTSP分析

client第一次发送DESCRIBE请求时不带授权信息,server返回401并且头部中包括字段realm是领域,通常是服务器名称或者域名。nonce是一个随机的字符串,在每个身份验证请求中都会不同。后续client发送的请求都要带上字段MD5使用32位小写值MD5在线计算当用不同的命令请求时需要重新计算response。server也需要用同样的方法计算response,然后校验client发送的response是否正确,正确则认证通过。

2023-04-04 14:25:43 493

原创 windows下使用ShiftMediaProject编译调试FFmpeg

可以重新运行project_get_dependencies.bat看看有没有报错,有报错则可能有的依赖没下载成功,这时要么继续运行该脚本下载,要么手动下载失败的仓库。将amf/public/include里的两个目录拷贝到msvc/include/AMF。glext.h,wglext.h放到目录msvc/include/gl。下载glext.h,wglext.h和khrplatform.h。编译成功,将下图三个目录拷贝到你的工程,导入VS,就能开发了。可以看到运行成功,如果失败就参考readme吧。

2023-03-31 20:07:08 635 1

原创 VS+Qt开发环境

VS:推荐VS2017以后的版本Qt:推荐Qt5.12以后的版本。

2023-03-29 13:55:11 1513 1

原创 H.264编码分析--NALU,帧和GOP,视频序列

视频编码是为了压缩视频。1个未压缩的1小时的1080p的视频(1秒25帧)占用大小:192010804360025=746,496,000,000字节,即700G左右一部小电影这么大,我们的网络带宽和硬盘容量怎么承受的了。所以视频和图片这些大文件都是经过压缩的。而H.264就是一种经典的视频编码(压缩)标准。

2023-03-28 11:28:10 1951

原创 Qt6.4.2下载安装-简单快速地安装

在命令行中执行安装器,添加 --mirror https://mirrors.ustc.edu.cn/qtproject 参数。在命令行中执行安装器,添加 --mirror https://mirrors.ustc.edu.cn/qtproject 参数。新版本的安装器(4.0.1-1 后)支持 --mirror 命令行参数。

2023-02-05 03:34:27 3400

原创 C++多态虚函数实现原理,对象和虚函数表的内存布局

基本概念我们知道C++动态多态是用虚函数实现的,而虚函数的实现方式虽说C++标准没有要求,但是基本都是用虚函数表实现的(编译器决定)。所以我们有必要了解一下虚函数表的实现原理。用virtual关键字声明的成员函数是虚函数。具有虚函数的类及其派生的类会在编译时创建虚函数表,简称虚表(vtbl),虚表是虚函数指针的数组。具有虚函数的类对象有一个虚表指针(vfptr),是编译器生成的指针,在对象构造时初始化。虚表指针vfptr指向虚表的第一个虚函数指针(即vfptr的值是虚表第一个...

2022-05-17 21:53:37 2707 37

原创 FastDFS源码分析-storage的线程分析

storage主要包括6种线程gdb attach storage进程ID 可以看到各线程堆栈:accept线程主线程是accept线程nio线程storage_service_init里创建了网络IO线程,work_thread_entrance可以看到线程2到5堆栈停在epoll_wait,网络IO线程默认是4个上报线程线程6是tracker_report_thread_entrance,用作storage向tracker上报信息调度线程线程7是调度线程,sched_thr

2022-04-11 17:59:00 1214 1

原创 简单的RTSP播放器

简介windows平台,纯视频流播放,暂不支持音频。局域网延迟在200到300毫秒。开发环境WIN10VS2017Qt5.12.9FFmpeg4.3.1 64位github地址效果图

2022-02-20 18:20:52 2227

原创 Qt控件设置动态样式

方法1 每个子控件都设置动态属性UI文件设置按钮qss:QPushButton#option {background: #FFFFFF;color: #999999;}// option和[之间不能有空格QPushButton#option[itemSelected = "true"] {background:rgb(65,205,82);color:white;}QLabel#text {color: #333333;}QLabel#text[itemSelecte

2022-02-15 00:40:32 1474

原创 使用有向邻接表检测死锁

使用有向邻接表检测死锁

2021-12-26 19:02:56 671

原创 简单的内存池实现

为什么要用内存池避免内存碎片减少系统调用次数(brk,mmap)内存碎片是什么不可用的空闲内存。这些内存小且不连续产生原因内存分配的起始地址需要是4/8/16的倍数(由CPU体系结构决定)夹在大块内存之间的小块空闲内存不易被使用可能出现问题服务器程序在长周期或者大量访问的情况后会变得反应迟钝,排查原因发现占用内存会随着请求数量的增多不规律而且不正常地增长,如果使用valgrind等工具发现没有内存泄露,则有可能是内存碎片。程序运行几天乃至几个月出现内存问题:例如malloc返回

2021-12-17 22:09:52 934

原创 单线程reactor支持百万连接

C1000K目的测试单线程reactor能否支持百万连接。1个连接由5元组唯一确定:local_iplocal_portpeer_ippeer_portprotocal已知ubuntu-1604的默认的端口范围:32768-60999假设client有20000个端口能用,server开100个端口,用2个client去连接server,则理论最大连接数是:20000 x 100 x 2 = 400万。代码修改在reactor的基础上,server开启100个监听端口。虚拟机配

2021-12-11 03:19:39 2207

原创 350行C代码实现epoll reactor模型

有了epoll为什么还需要reactor?响应快,不必为单个同步事件所阻塞,虽然 Reactor 本身依然是同步的; 编程相对简单,可以最大程度的避免复杂的多线程及同步问题,并且避免了多线程/进 程的切换开销; 可扩展性,可以方便的通过增加 Reactor 实例个数来充分利用 CPU 资源; 可复用性,reactor 框架本身与具体事件处理逻辑无关,具有很高的复用性;reactor的思想:将对IO的处理转化为对事件的处理。reactor包括5个部分reactor管理器 注.

2021-12-10 16:36:30 1817

原创 理解linux内核数据结构尾队列(Tail queue)

Tail queue位于/usr/include/x86_64-linux-gnu/sys/queue.hqueue.h包含以下几种数据结构:双链表(List) 单链表(Singly-linked List) 单链尾队列(Singly-linked Tail queue) 简单队列(Simple queue) 双链尾队列(Tail queue) 循环队列(Circular queue)Tail queue几个参数含义HEADNAME链表头结点的名字,用TAILQ_HEAD(H

2021-11-29 15:53:12 2259

原创 180行C代码实现epoll echo server

#include <sys/epoll.h>#include <sys/socket.h>#include <stdio.h>#include <netinet/in.h> // sockaddr_in#include <netinet/ip.h>#include <arpa/inet.h> // inet_addr#include <errno.h>#include <string.h>#...

2021-11-14 23:50:08 1010

原创 代码配图快速理解红黑树

红黑树(英语:Red–black tree)是一种自平衡二叉查找树,典型用途是实现关联数组。红黑树的操作有着良好的最坏情况运行时间,并且在实践中高效:它可以在O(log n)时间内完成查找、插入和删除,这里的n是树中元素的数目。红黑树的性质红黑树是每个节点都带有颜色属性的二叉查找树,颜色为红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:节点是红色或黑色。 根是黑色。 所有叶子都是黑色(叶子是NIL节点)。 每个红色节点必须有两个黑色的子节点。(从每

2021-10-20 01:36:52 204

原创 DPDK-虚拟机配置网卡多队列

配置网卡多队列1.设置巨页sudo vim /etc/default/grub如果是虚拟机:GRUB_CMDLINE_LINUX改成GRUB_CMDLINE_LINUX="find_preseed=/preseed.cfg noprompt net.ifnames=0 biosdevname=0 default_hugepagesz=2M hugepagesz=2M hugepages=1024 isolcpus=0-2"如果是物理机:default_hugepages=

2021-09-07 11:32:25 3398

原创 平衡二叉树快速入门

定义平衡因子二叉树结点的左子树与右子树的高度(深度)差即为该结点的平衡因子(BF,Balance Factor)。最小失衡子树代码实现《大话数据结构》里的平衡二叉树是用平衡因子实现的,这种方法效率略高,却实现复杂。《数据结构与算法分析C++》里是用的高度实现的。接下来会分别介绍两种实现方式。利用平衡因子实现平衡二叉树这种实现方式复杂的地方在于平衡因子的更新。插入节点插入流程:按二叉排序树插入 插入后判断是否平衡 平衡则修改平衡因子 不平衡则判断类型,单旋..

2021-08-25 00:05:35 303

原创 protobuf笔记

官网:https://developers.google.com/protocol-buffers/docs/proto3https://developers.google.com/protocol-buffers/docs/encoding编译安装wget https://github.com/protocolbuffers/protobuf/archive/refs/tags/v3.17.3.tar.gzcd protobuf-3.17.3sh ./autogen.sh./cou

2021-07-26 23:48:31 319

原创 const char*(字符串常量)能否赋值给char*

上面 这行代码再VS2015是能正常编译的。而VS2017直接报错:然后再看看linux平台如何,测试环境:ubuntu1604 gcc version 5.4.0用gcc编译通过用g++编译也能通过,不过会警告:我们知道字符串常量是位于静态存储器,内存只读。所以正常使用应该如下:const char *p = "hello";为什么会出现上面的不同,SO上看到一个回答:意思是字符串常量在C中是char数组,在C++中是const char数组,C++为了兼...

2021-07-20 00:45:39 7767

原创 linux设置用户拥有部分sudo权限

用户管理相关命令:useradd usermod userdel groupadd newgrp groupdel chown chmod设置sudo权限主要是修改/etc/sudoers这个文件修改这个文件先有添加写权限:chmod u+w/etc/sudoers改完后再删除写权限:chmod u-w/etc/sudoers这里为什么是设置部分权限呢?这是一个权限安全的问题。普通用户使用某些命令的时候不能有sudo权限,不然太危险了。假设一个开发团队里组长有root权限..

2021-07-10 16:15:45 976

原创 SSH通过秘钥登录

1.服务器生成秘钥对cd ~ssh-keygen -t rsa -b 4096这里我给秘钥设置了密码(passphrase)2. 服务器安装公钥 cd .ssh cat id_rsa.pub >> authorized_keys然后修改访问权限:[root@host .ssh]$ chmod 600 authorized_keys[root@host .ssh]$ chmod 700 ~/.sshssh对公钥的访问权限有严格要求,如不设置上面两行则会报错:Serv

2021-07-10 04:18:25 2635 1

原创 MongoDB笔记

目录遇到问题概念CURD操作索引聚合聚合管道集群主从复制集群复制集集群分片集群分片策略哈希分片范围分片遇到问题什么是分片?内存映射?有了内存映射为什么还弄个Journal?use创建集合后show dbs不能马上看到,要等一段时间?嵌入式文档和数组减少了对连接的需求?概念MongoDB一台机器可以有多个实例,每个实例端口不同,dbpath不同与redis区别:mongodb自带统计功能CURD操作

2021-07-07 22:26:09 285

原创 linux常用命令

进程管理ps命令查看所有进程:ps -efl查看指定参数:ps -eo pid,ppid,pgid,sid查看CPU占用最高的进程:ps -eo pid,pcpu k pcpu | tail -1ps -eo pid,pcpu --sort pcpu | tail -1ps -eo pid,pcpu | sort -nk 2 | tail -2k和--sort一样,tail -1和tail -n 1一样。sort:-n按字符串排序,-k 2表示根据输入的第2项排..

2021-07-04 16:14:32 157

原创 使用samba共享文件

用过mount命令挂载windows目录到linux,这个方法有几个问题:会出现符号链接的问题(windows无法创建符号链接) windows通过git拉项目下来,然后通过共享目录挂载到linux,结果在linux项目运行出错原因:由于windows下git设置了autocrlf true(自动转换lf为crlf),然后共享目录到linux,linux下读到的配置文件的是crlf,不是lf,结果解析字符串出错(const char* user="root\r"),多了个'\r' 解决方法:使用do.

2021-07-03 15:49:10 760

原创 VSCode配置

目的:方便在windows阅读和编辑linux代码为了以后不用输入密码连接linux,需要配置ssh生成ssh公钥和私钥,powershell输入:ssh-keygen -t rsa -b 4096windows连接到linux,公钥会被拷贝到linux的$HOME\.ssh\authorized_keys// root@192.168.1.111$USER_AT_HOST="your-user-name-on-host@hostname"$PUBKEYPATH="$HOME\.

2021-06-23 22:48:04 149 2

原创 Qt信号槽传const&和传值有什么不同

之前一直在纠结Qt的信号槽是否要传引用,如果传引用会不会有悬挂引用的问题。故参考Copied or Not Copied: Arguments in Signal-Slot Connections?这篇博客测试一下CopyTest.h#include <QObject>class CCopyable{public: // qRegisterMetaType的类需要默认构造函数 CCopyable(); CCopyable(int id, const

2021-06-10 14:13:16 1651

原创 Qt在视频窗口上显示半透明控件

场景:视频窗口QLabel的句柄传给DXVA,由DXVA渲染。在视频窗口上显示半透明的控件(文本)。如果是纯Qt渲染的话,显示透明控件只需要设置qssrgba的a,例如:QLabel{background:rgba(255,0,0,0.3);}但是当把Qt控件交给原生UI(这里我用的是DXVA2,目的是GPU硬解码和渲染)显示视频流的时候,透明就失效了。首先视频窗口和透明控件不能是父子对象关系,否则子对象(透明控件)会直接隐藏,所以必须是同级的。解决方法:子类化QLabel,设置.

2021-06-08 23:55:12 2444

原创 WIN10 API打印CPU占用率

环境:win10+VS2017网上找了几个demo发现CPU占用率不准确,跟任务管理器不一样。最后参考github项目TrafficMonitor,能过获取比较准确的CPU占用率。注意要一秒获取一次CPU占用率,时间太短就准确了。WinVersionHelper.h#pragma once#define g_winVerHelper CWinVersionHelper::instance()class CWinVersionHelper{public: static C

2021-05-23 22:17:21 2549 2

原创 字符串查找匹配算法KMP

是什么:在主字符串中查找子字符串,返回第一次出现的子字符串的第一个字符索引为什么:暴力查找字符串的时间复杂度O(n*m),kmp时间复杂度O(n+m)。n是主串长度,m是模式串长度。例如待查找字符串ababababca(本文统称为主串s),要匹配的字符串abababca(本文统称模式串p)按照暴力查找的逻辑,主字符串匹配失败后接着回溯到首字符的下一个位置开始匹配,这样效率是很低的。而KMP可以在匹配失败的时候主串不回溯,只回溯模式串,这一行查找速度就快了很多。部分匹配表,即PMT.

2021-05-16 04:09:49 544 1

原创 C++模板实现十大排序算法

所有排序算法默认升序排序。1. 冒泡排序适用:元素个数小的情况template<typename T>void Swap(T &lhs, T&rhs){ T tmp = rhs; rhs = lhs; lhs = tmp;}template<typename T>void bubble_sort(T *arr, int n){ for (int i = 0; i < n - 1; ++i) { ..

2021-05-15 00:23:50 663

原创 解决CentOS虚拟机遇到的问题

环境:CentOS7, VMware14有时候hwclock -s同步时间会导致虚拟机IP改变,然后SSH客户端就断开连接了。所以还是设置固定IP吧:1.修改虚拟机网络配置文件:vim /etc/sysconfig/network-scripts/ifcfg-ens33TYPE="Ethernet"PROXY_METHOD="none"BROWSER_ONLY="no"BOOTPROTO="static"DEFROUTE="yes"IPV4_FAILURE_FATAL=".

2021-04-15 23:53:11 450

原创 QtAV编译和使用

环境:x64 QtAV1.13 Qt5.12.10 VS2017 FFmpeg4.3.2编译步骤:git clone https://github.com/wang-bin/QtAV.gitcd QtAV && git submodule update --init可以下载官方推荐的FFmpeg依赖包:https://sourceforge.net/projects/qtav/files/depends/QtAV-depends-windows-x86%2Bx64.

2021-03-10 22:08:25 1062

原创 记录FFmpeg遇到的问题

1. 推流rtsp到EasyDarwin的时候,如果断网了或EasyDarwin进程没启动则avformat_write_header会一直阻塞 然后线程会一直阻塞在avformat_write_header解决方法: AVFormatContext设置中断回调,回调函数中判断avformat_write_header是否超时,超时则退出阻塞参考链接由于设置了中断回调,故所有阻塞函数都要重置超时时间,否则这些函数会调用失败。例如: 超时中断会导致av_interleaved_write_fr

2021-02-06 00:19:56 1791 4

原创 Qt USB摄像头支持热插拔

1.注册USB摄像头插拔事件bool util::registerDevNitification(QWidget *widget){#if 1 static const GUID GUID_DEVINTERFACE_LIST[] = { // GUID_DEVINTERFACE_CAMERA_DEVICE { 0x65E8773D, 0x8F56, 0x11D0, { 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x3.

2021-01-31 18:03:47 1286

原创 Qt VS *.vcxproj.user文件设置

VS对Qt的支持不太友好有时候会提示找不到Qt的头文件,但是其实是有的。这时候在项目目录下编辑 ProjectName.vcxproj.user文件输入如下:<?xml version="1.0" encoding="utf-8"?><Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup /> <

2020-12-19 18:23:50 1231 3

原创 centos7编译opencv

环境依赖:centos7.5 opencv4.3.0 opencv_contrib-4.3.0 CUDA10.2 cudnn(和CUDA版本一致)新建build.sh脚本,输入如下:cmake \-D CMAKE_BUILD_TYPE=RELEASE \-D BUILD_SHARED_LIBS=OFF \-D CMAKE_INSTALL_PREFIX=/opt/opencv-4.3.0 \-D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.3.0/

2020-11-09 23:34:22 555

IocpHttpServer.zip

基于IOCP的HTTP服务器。 开发语言:C++ 本项目的重点是IOCP,至于HTTP服务,暂时只实现了GET方法,在浏览器输入IP:端口,则返回hello字符串。后面有空继续实现HTTP协议的其它方法。 使用方法:使用VS2017打开解决方案,运行,在浏览器输入服务器ip:port。

2019-07-28

Qt+FFmpeg录音

Qt+FFmpeg录音,支持开始,暂停,结束。 //主线程:Qt GUI线程 //父线程:RecordAudioThreadProc //子线程:AcquireSoundThreadProc

2019-03-06

Qt调用FFmpeg命令录屏

Windows平台,Qt调用FFmpeg.exe进行录屏。支持操作,开始录屏-暂停-结束录屏。

2019-02-25

odb C++框架依赖包

ODB: C++ Object-Relational Mapping (ORM) odb C++框架依赖包

2018-04-20

调用科大讯飞API实现文本转语音源码

调用科大讯飞API实现文本转语音 该项目采用科大讯飞提供的API接口,使用C语言实现语音合成功能。 语音合成功能:用户在文本框输入一段文字,会生成相应语音,可以应用到动画视频场景中。可以选择发音的人物,音量,语速。

2018-04-20

数据结构算法与应用-C++语言描述.pdf

数据结构算法与应用-C++语言描述.pdf

2017-04-01

贪吃蛇源码

贪吃蛇源码

2017-03-28

扫雷的源码和可执行程序

扫雷的源码和可执行程序

2017-03-28

31个项目的源码

俄罗斯方块,简单计算器,理财助手,学生成绩管理系统,坦克大战,二叉树排序,仓库管理系统等31个小项目的源码。

2017-03-28

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除